package org.club.Controller;

import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.club.Service.AdminInfoService;
import org.club.common.model.dto.ClubActivityDto;
import org.club.common.model.dto.ClubInfoDto;
import org.club.common.model.dto.UpdatePersonalInfoRequestDto;
import org.club.common.model.dto.UserInfoDto;
import org.club.common.model.vo.*;
import org.club.common.util.ApiResponseMe;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 系统管理员控制器，负责处理与系统管理员相关的请求
 * 包括用户和社团的信息管理、状态设置等
 */
@Tag(name = "系统管理员相关功能", description = "管理所有用户和社团的增删改查")
@RestController
@RequestMapping("/admin")
@Slf4j
public class AdminController {

    @Autowired
    private AdminInfoService adminInfoService;

    /**
     * 获取用户俱乐部信息列表
     *
     * @param userClubInfoDto 用户信息，包含查询所需参数
     * @return 包含用户信息列表和总记录数的响应
     */
    @PostMapping("/getUserPage")
    public ApiResponseMe getUserClubInfoPage(@RequestBody UserInfoDto userClubInfoDto) {
        List<UserInfoVO> pageInfo = adminInfoService.getUserClubInfoList(userClubInfoDto);
        Integer total = adminInfoService.seletCount(userClubInfoDto);
        PageResponse<UserInfoVO> userInfoVOPageResponse = new PageResponse<>(pageInfo, total);
        return ApiResponseMe.success(userInfoVOPageResponse);
    }

    /**
     * 获取社团信息列表
     *
     * @param clubInfoDto 社团信息，包含查询所需参数
     * @return 包含社团信息列表和总记录数的响应
     */
    @PostMapping("/getClubPage")
    public ApiResponseMe getClubPage(@RequestBody ClubInfoDto clubInfoDto) {
        List<ClubInfoVO> pageInfo = adminInfoService.getClubInfolist(clubInfoDto);
        Integer total = adminInfoService.seletClubCount(clubInfoDto);
        PageResponse<ClubInfoVO> userInfoVOPageResponse = new PageResponse<>(pageInfo, total);
        return ApiResponseMe.success(userInfoVOPageResponse);
    }

    /**
     * 获取用户管理的社团信息
     *
     * @param userId 用户ID
     * @return 包含用户管理的社团信息的响应
     */
    @PostMapping("/getUserClubAdmin")
    public ApiResponseMe getUserClubAdmin(@RequestParam Long userId) {
        return ApiResponseMe.shape(true, adminInfoService.getClubAdmin(userId));
    }

    /**
     * 删除用户
     *
     * @param userId 用户ID
     * @param username 用户名
     * @return 删除操作结果的响应
     */
    @PostMapping("/deleteUser")
    public ApiResponseMe deleteUser(@RequestParam Long userId, @RequestParam String username) {
        adminInfoService.deleteUser(userId, username);
        return ApiResponseMe.shape(true, "删除成功");
    }

    /**
     * 设置用户状态
     *
     * @param userId 用户ID
     * @param status 用户状态
     * @return 设置操作结果的响应
     */
    @PostMapping("/setUserstatus")
    public ApiResponseMe setUserstatus(@RequestParam Long userId, @RequestParam String status) {
        adminInfoService.setUserstatus(userId, status);
        return ApiResponseMe.shape(true, "修改成功");
    }

    /**
     * 设置社团活动状态
     *
     * @param clubId 社团ID
     * @param activity_status 活动状态
     * @return 设置操作结果的响应
     */
    @PostMapping("/setClubactivity_status")
    public ApiResponseMe setClubstaus(@RequestParam Long clubId, @RequestParam String activity_status) {
        adminInfoService.setClubactivitystatus(clubId, activity_status);
        return ApiResponseMe.shape(true, "修改成功");
    }

    /**
     * 设置社团状态
     *
     * @param clubId 社团ID
     * @param status 社团状态
     * @return 设置操作结果的响应
     */
    @PostMapping("/setClubstatus")
    public ApiResponseMe setClubstatus(@RequestParam Long clubId, @RequestParam String status) {
        adminInfoService.setClubstatus(clubId, status);
        return ApiResponseMe.shape(true, "修改成功");
    }

    /**
     * 更新个人信息
     *
     * @param updatePersonalInfoRequestDto 更新个人信息请求DTO
     * @param file 用户上传的文件
     * @return 更新后的用户信息的响应
     */
    @PostMapping("/updatePersonalInfo")
    public ApiResponseMe updatePersonalInfo(@RequestPart("updatePersonalInfoRequestDto") UpdatePersonalInfoRequestDto updatePersonalInfoRequestDto, @RequestPart(name = "file", required = false) MultipartFile file) {
        UserVo userVo = adminInfoService.updatePersonalInfo(updatePersonalInfoRequestDto, file);
        return ApiResponseMe.success(userVo);
    }

    /**
     * 获取社团活动信息
     *
     * @param clubActivityDto 社团活动DTO，包含查询所需参数
     * @return 包含社团活动信息的响应
     */
    @PostMapping("/getClubActivity")
    public ApiResponseMe getClubActivity(@RequestBody ClubActivityDto clubActivityDto) {
        ClubActivityResponseVO response = adminInfoService.getClubActivity(clubActivityDto);
        return ApiResponseMe.success(response);
    }
}
